package com.queue;
//数组实现栈
public class ArrayStack<Item> {
    // 栈元素的总数
    private int N = 0;
    // 存放栈元素的数组
    private Item [] items;
    public ArrayStack (int M) {
        items = (Item[]) new Object[M];
    }
    /**
     * @description: 调整栈的大小
     */
    private void resize (int max) {
        Item [] temp = (Item [])new Object[max];
        for (int i =0;i<items.length;i++) {
            temp[i] = items[i];
        }
        items = temp;
    }
    /**
     * @description: 向栈顶插入元素
     */
    public void push (Item item) {
        // 当栈满了的时候， 将栈的数组大小扩大为原来两倍
        if (N==items.length) resize(2*N);
        items[N++] = item;
    }
    /**
     * @description: 从栈顶删除元素，并将删除的元素返回
     */
    public Item pop () {
        // 当栈还是空的时候， 不删除并且返回空
        if(isEmpty()) return null;
        // 保存将要被删除的元素
        Item i = items[N-1];
        // 将该元素删除
        items[N-1] = null;
        // 栈的长度减1
        N--;
        return i;
    }

    /**
     * @description: 判断栈是否为空
     */
    public boolean isEmpty () {
        return N == 0;
    }
    /**
     * @description: 返回栈的大小
     */
    public int size () {
        return N;
    }

    public static void main (String args []) {
        // 开始时指定栈的容量为2
        ArrayStack<Integer> stack = new ArrayStack<>(2);
        // 向栈顶依次添加3个元素
        stack.push(1);
        stack.push(2);
        stack.push(3);
        // 添加3后栈的容量自动扩大了
        // 依次从栈顶删除3个元素
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}
